package com.example.inventory.repository;

import com.example.inventory.model.entity.ProductSku;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import jakarta.persistence.LockModeType;
import java.util.Optional;

/**
 * 商品SKU数据访问层
 * 
 * @author mall-team
 */
@Repository
public interface ProductSkuRepository extends JpaRepository<ProductSku, Long> {

    /**
     * 根据SKU编码查询（悲观锁）
     * 用于库存扣减时防止并发问题
     * 
     * @param skuCode SKU编码
     * @return SKU信息
     */
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("SELECT s FROM ProductSku s WHERE s.skuCode = :skuCode")
    Optional<ProductSku> findBySkuCodeWithLock(@Param("skuCode") String skuCode);

    /**
     * 根据ID查询（悲观锁）
     * 
     * @param id SKU ID
     * @return SKU信息
     */
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("SELECT s FROM ProductSku s WHERE s.id = :id")
    Optional<ProductSku> findByIdWithLock(@Param("id") Long id);

    /**
     * 根据SKU编码查询
     * 
     * @param skuCode SKU编码
     * @return SKU信息
     */
    Optional<ProductSku> findBySkuCode(String skuCode);
}

